package sys

import (
	"github.com/gofiber/fiber/v2"
	"go-web2/app/common/config"
	"go-web2/app/model/sys"
)

type MenuController struct{}

// 菜单树列表
func (MenuController) GetList(c *fiber.Ctx) error {
	menu := sys.SysMenu{}
	menu.Name = c.Query("name")
	menu.State = c.QueryInt("state")
	return c.Status(200).JSON(config.Success(menu.GetList()))
}

// 路由列表
func (MenuController) GetRouters(c *fiber.Ctx) error {
	menu := sys.SysMenu{}
	token := c.Get(config.TokenHeader)
	menu.Id = sys.GetLoginUser(token).RoleId
	return c.Status(200).JSON(config.Success(menu.GetRouters()))
}

// 根据id获取菜单
func (MenuController) GetById(c *fiber.Ctx) error {
	menu := sys.SysMenu{}
	menu.Id = c.Params("id")
	menu.GetById()
	return c.Status(200).JSON(config.Success(menu))
}

// 获取对应角色菜单列表树
func (MenuController) RoleMenuTree(c *fiber.Ctx) error {
	menu := sys.SysMenu{}
	roleMenu := sys.SysRoleMenu{}
	roleMenu.RoleId = c.Params("roleId")
	checkedIds := roleMenu.GetMenuIdByRoleId() // 根据角色id获取当前角色选中的菜单id
	result := map[string]any{}
	result["menus"] = menu.GetList()   // 获取所有菜单
	result["checkedKeys"] = checkedIds // 当前角色选中的菜单id
	return c.Status(200).JSON(config.Success(result))
}

// 新增菜单
func (MenuController) Insert(c *fiber.Ctx) error {
	menu := sys.SysMenu{}
	if err := c.BodyParser(&menu); err != nil {
		return c.Status(200).JSON(config.Error(err.Error()))
	}
	menu.Token = c.Get(config.TokenHeader)
	err := menu.Insert()
	if err != nil {
		return c.Status(200).JSON(config.Error(err.Error()))
	}
	return c.Status(200).JSON(config.Success(nil))
}

// 修改菜单
func (MenuController) Update(c *fiber.Ctx) error {
	menu := sys.SysMenu{}
	if err := c.BodyParser(&menu); err != nil {
		//log.Error(err.Error())
		return c.Status(200).JSON(config.Error(err.Error()))
	}
	err := menu.Update()
	if err != nil {
		return c.Status(200).JSON(config.Error(err.Error()))
	}
	return c.Status(200).JSON(config.Success(nil))
}

// 删除菜单
func (MenuController) Delete(c *fiber.Ctx) error {
	menu := sys.SysMenu{}
	menu.Id = c.Params("id")
	if err := menu.Delete(); err != nil {
		return c.Status(200).JSON(config.Error(err.Error()))
	}
	return c.Status(200).JSON(config.Success(nil))
}
